import http from '@/utils/http'
import store, { AppDispatch } from '..'

/**
 * 获取文章新闻推荐
 * @param channel_id 频道ID
 * @param timestamp  时间戳，请求新的推荐数据传当前的时间戳，请求历史推荐传指定的时间戳
 * @returns {Promise} Promise<void>
 */
export const getArticles = ({ channel_id = 0, timestamp = Date.now(), isRefresh = false }) => {
  return async (dispatch: AppDispatch) => {
    const res = await http.get(`/v1_0/articles`, { params: { channel_id, timestamp } })
    console.log(`/v1_0/articles`, res.data.results)
    // 先获取原本的 articles 对象的数据
    const { articles } = store.getState().article
    // 🔔获取当前频道的新闻列表，可能获取到 undefined 或者 新闻数组[]
    const list = articles[channel_id]?.list
    const pre_timestamp = res.data.pre_timestamp
    // 如果是刷新业务，也是用新的数据覆盖旧数据
    if (!list || isRefresh) {
      // 🔔 情况1：如果没有列表，就直接存
      dispatch({
        type: 'article/saveArticles',
        payload: {
          // 展开原本的频道新闻数据
          ...articles,
          // 再追加新的频道新闻数据
          // 🎯 注意这里要设置动态的频道 id，需要使用方括号[]语法动态设置键名称
          [channel_id]: {
            // 需要把后端返回的时间戳存起来，用于分页请求，防止出现重复的推荐
            timestamp: pre_timestamp,
            list: res.data.results,
          },
        },
      })
    } else {
      // 🔔 情况2：如果有列表，需要把新，旧两份数组拼接在一起
      dispatch({
        type: 'article/saveArticles',
        payload: {
          ...articles,
          [channel_id]: {
            // 需要把后端返回的时间戳存起来，用于分页请求，防止出现重复的推荐
            timestamp: pre_timestamp,
            list: [...list, ...res.data.results],
          },
        },
      })
    }
    if (!pre_timestamp) {
      return Promise.reject('没有推荐了')
    }
  }
}

/**
 * 文章标记 -  文章不感兴趣和举报
 * @param visible     用于控制标记弹窗的显示与隐藏
 * @param article_id  需要标记的文章 id
 * @returns
 */
export const setArticleMark = ({ visible = false, article_id = '' }) => {
  return async (dispatch: AppDispatch) => {
    dispatch({ type: 'article/setMark', payload: { visible, article_id } })
  }
}

/**
 * 文章标记为不喜欢
 * @param target   不喜欢的文章id
 * @returns
 */
export const setArticleDislikes = (target: string) => {
  return async (dispatch: AppDispatch) => {
    // 发送请求让后端更新文章的标记为不喜欢
    const res = await http.post(`/v1_0/article/dislikes`, { target })
    console.log(`/v1_0/article/dislikes`, res)
    // 从 redux 把当前文章删除
    // 获取当前频道 id
    const activeId = store.getState().channel.activeId
    // // 根据频道 id 获取文章列表
    const articles = store.getState().article.articles
    // const { channel: { activeId }, article: { articles } } = store.getState()
    // 根据频道 id 获取文章列表
    const { list, timestamp } = articles[activeId]
    // console.log({ list, timestamp })
    dispatch({
      type: 'article/saveArticles',
      payload: {
        // 保留其他频道的数据
        ...articles,
        // 当前频道的不喜欢的那条文章过滤掉
        [activeId]: {
          timestamp,
          list: list.filter((v) => v.art_id !== target),
        },
      },
    })
  }
}

/**
 * 举报文章
 * @param target   不喜欢的文章id
 * @param type     举报类型： 0-其他问题，1-标题夸张，2-低俗色情，3-错别字多，4-旧闻重复，5-广告软文，6-内容不实，7-涉嫌违法犯罪，8-侵权'
 * @param remark   其他问题 的附加说明
 * @returns
 */
export const setArticleReports = ({ target = '', type = '0', remark = '' }) => {
  return async (dispatch: AppDispatch) => {
    // 发送请求让后端更新文章的标记为不喜欢
    const res = await http.post(`/v1_0/article/reports`, { target, type, remark })
    console.log(`/v1_0/article/reports`, res)
    // 从 redux 把当前文章删除
    // 获取当前频道 id
    const activeId = store.getState().channel.activeId
    // // 根据频道 id 获取文章列表
    const articles = store.getState().article.articles
    // const { channel: { activeId }, article: { articles } } = store.getState()
    // 根据频道 id 获取文章列表
    const { list, timestamp } = articles[activeId]
    // console.log({ list, timestamp })
    dispatch({
      type: 'article/saveArticles',
      payload: {
        // 保留其他频道的数据
        ...articles,
        // 当前频道的不喜欢的那条文章过滤掉
        [activeId]: {
          timestamp,
          list: list.filter((v) => v.art_id !== target),
        },
      },
    })
  }
}

/**
 * 获取新闻详情
 * @param article_id 文章id
 * @returns
 */
export const getArticleDetail = (article_id: string) => {
  return async (dispatch: AppDispatch) => {
    const res = await http.get(`/v1_0/articles/${article_id}`)
    console.log(`/v1_0/articles/${article_id}`, res)
    dispatch({ type: 'article/saveDetail', payload: res.data })
  }
}

/**
 * 点赞和取消点赞
 * @param target 文章id
 * @returns
 */
export const changeArticleLikings = (target: string) => {
  return async (dispatch: AppDispatch) => {
    // 	用户对文章的态度, -1: 无态度，0-不喜欢，1-点赞
    const { detail } = store.getState().article
    if (detail.attitude !== 1) {
      // 情况1：点赞
      await http.post(`/v1_0/article/likings`, { target })
      // console.log(res)
      dispatch({
        type: 'article/changeDetail',
        payload: { like_count: detail.like_count + 1, attitude: 1 },
      })
    } else {
      // 情况2：取消点赞
      await http.delete(`/v1_0/article/likings/${target}`)
      // console.log(res)
      dispatch({
        type: 'article/changeDetail',
        payload: { like_count: detail.like_count - 1, attitude: -1 },
      })
    }
  }
}

/**
 * 收藏文章和取消收藏
 * @param target 文章id
 * @returns
 */
export const changeArticleCollections = (target: string) => {
  return async (dispatch: AppDispatch) => {
    // 	用户对文章的态度, -1: 无态度，0-不喜欢，1-点赞
    const { detail } = store.getState().article
    if (detail.is_collected === false) {
      // 情况1：收藏文章
      await http.post(`/v1_0/article/collections`, { target })
    } else {
      // 情况2：取消收藏
      await http.delete(`/v1_0/article/collections/${target}`)
    }
    const is_collected = !detail.is_collected
    dispatch({
      type: 'article/changeDetail',
      payload: { is_collected },
    })
  }
}
